package com.blackhorse.order.controller;

import com.blackhorse.order.entity.Product;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/order")
//@DefaultProperties(defaultFallback = "defaultFallBack") //指定此类中公共的熔断配置，这里指定方法后@HystrixCommand就不需要指定方法了
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    //使用注解配置熔断保护 fallbackMethod 配置熔断之后的降级方法
    @HystrixCommand(fallbackMethod = "orderFallBack") //使用特定降级方法
    //@HystrixCommand //使用统一降级方法
    @GetMapping("/buy/{id}")
    public Product buyProductById(@PathVariable Long id) {
        if (id <= 0) {
            throw new IllegalArgumentException("id:" + id + " is illegal!");
        }

        String url = "http://service-product/product/" + id; //使用ribbon时，url写服务名
        Product product = restTemplate.getForObject(url, Product.class);
        return product;
    }

    //降级方法，需要和受到保护的方法返回值一致，方法参数一致
    public Product orderFallBack(Long id) {
        Product product = new Product();//构造一个本地数据
        product.setProductName("订单服务繁忙，请稍后再试...");
        return product;
    }

    //统一的降级方法，没有参数
    public Product defaultFallBack() {
        Product product = new Product();//构造一个本地数据
        product.setProductName("服务器繁忙，请稍后再试...");
        return product;
    }

}
